﻿using System.ComponentModel.DataAnnotations;

namespace wwl.Contract.Dtos.Requests.Rbac
{
  /// <summary>
  /// 更新租户的请求模型（前端→后端的更新参数契约）
  /// 封装权限模块（Rbac）中租户信息更新场景的专用数据载体，用于接收前端传递的待更新字段
  /// </summary>
  /// <remarks>
  /// 属于契约层的请求模型，仅包含允许更新的业务字段，与领域实体（<see cref="Domain.Entities.Rbac.Tenant"/>）解耦
  /// 区别于创建请求，更新请求无需传递租户编码（通常不允许修改编码），聚焦可变更的核心信息
  /// </remarks>
  public class UpdateTenantRequest
  {
    /// <summary>
    /// 租户名称（待更新的显示用标识）
    /// </summary>
    /// <remarks>
    /// 1. 业务约束：不可为空且长度不超过128字符，支持修改租户的展示名称（如品牌更名场景）
    /// 2. 与领域实体映射：对应 <see cref="Domain.Entities.Rbac.Tenant.TenantName"/>，更新时覆盖原名称
    /// 3. 校验逻辑：通过 <see cref="RequiredAttribute"/> 和 <see cref="StringLengthAttribute"/> 确保基础合法性，
    ///    领域层无需重复处理格式校验，聚焦业务规则
    /// </remarks>
    [Required(ErrorMessage = "租户名称不能为空")]
    [StringLength(128, ErrorMessage = "租户名称长度不能超过128个字符")]
    public string TenantName { get; set; } = string.Empty;

    /// <summary>
    /// 租户状态（待更新的业务状态）
    /// </summary>
    /// <remarks>
    /// 1. 业务约束：不可为空，必须传递有效的状态字符串（对应 <see cref="Domain.Entities.Rbac.TenantStatus"/> 枚举值）
    /// 2. 与领域枚举映射：前端传递枚举字符串（如"ENABLED"、"DISABLED"），后端转换为枚举类型后调用领域实体的状态变更方法（如 <see cref="Domain.Entities.Rbac.Tenant.Enable"/>）
    /// 3. 状态变更规则：领域层会校验状态变更的合法性（如从禁用→启用是否符合业务条件），本模型仅负责传递参数
    /// </remarks>
    [Required(ErrorMessage = "租户状态不能为空")]
    public string Status { get; set; } = string.Empty;

    /// <summary>
    /// 租户备注信息（可选更新字段）
    /// </summary>
    /// <remarks>
    /// 1. 业务用途：支持更新租户的附加说明（如补充最新备注或清空原有备注）
    /// 2. 与领域实体映射：对应 <see cref="Domain.Entities.Common.BaseEntity.Remarks"/>，为null时不更新（保留原备注）
    /// 3. 灵活性设计：允许前端选择是否传递该字段，后端根据实际值决定是否执行更新
    /// </remarks>
    [StringLength(50, ErrorMessage = "备注信息长度不能超过50个字符")]
    public string? Remarks { get; set; }
  }
}